home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 5815 < prev    next >
Encoding:
Internet Message Format  |  1996-08-05  |  3.1 KB

  1. Path: keats.ugrad.cs.ubc.ca!not-for-mail
  2. From: c2a192@ugrad.cs.ubc.ca (Kazimir Kylheku)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Why does this work?
  5. Date: 20 Feb 1996 11:36:39 -0800
  6. Organization: Computer Science, University of B.C., Vancouver, B.C., Canada
  7. Message-ID: <4gd7s7INNnjr@keats.ugrad.cs.ubc.ca>
  8. References: <4g8f7o$adt@ncar.ucar.edu>
  9. NNTP-Posting-Host: keats.ugrad.cs.ubc.ca
  10.  
  11. In article <4g8f7o$adt@ncar.ucar.edu>,
  12. Jim Rosinski <rosinski@ra.cgd.ucar.edu> wrote:
  13. >
  14. >Could someone please explain why the following code works?  In particular, I
  15. >am perplexed as to why "sub1" and "sub2" declared as elements of "cmndtable"
  16. >are valid "pointers to function returning void" (i.e. see the definition of
  17. >"cmndstruct").  When executed, the net result is indeed to invoke two
  18. >functions, "sub1", and "sub2" (tested on Solaris, AIX, and UNICOS).
  19.  
  20. It works because the initializers are just assigned to whatever available
  21. fields there are in the structure. I guess what you are asking is why you
  22. weren't forced to write the initializer as { { sub1 }, { sub 2 }, { NULL } } to
  23. indicate that the elements are part of the structure, right?
  24.  
  25. Your usage might not be standard, even though it's silently accepted by three
  26. compilers you know. K&R2 says, on p. 219, that
  27.  
  28.     "The initializer for a structure is is either an expression of
  29.     the same type, or a brace-enclosed list of initializers for its
  30.     members in order.  Unnamed bit-field members are ignored, and
  31.     are not initialized.  If there are fewer initializers in the
  32.     list than members of the structure, the trailing members are
  33.     initialized with 0.  There may not be more initializers than
  34.     members."
  35.  
  36. So far, this would indicate that your code is not compliant, unless the
  37. function pointer's type is compatible with a single-membered structure
  38. containing a function pointer (not true).
  39.  
  40. However, a few paragraphs later, the K&R talks about more rules regarding
  41. aggregate initializers:
  42.  
  43.     "An _aggregate_ is a structure or array. If an aggregate contains
  44.     members of aggregate type, the initialization rules apply recursively.
  45.     Braces may be elided in the initialization as follows: if the
  46.     initializer for an aggregate's member that is itself an aggregate
  47.     begins with a left brace, the the succeeding comma-separated list of
  48.     initializers initializes members of the subaggregate; it is erroneous
  49.   *>    for there to be more initializers than members. If, however, the
  50.   *>    initializer for a subaggregate does not begin with a left brace, then
  51.   *>    only enough elements from the list are taken to account for the the
  52.   *>    members of the subaggregate; any remaining members are left to
  53.   *>    initialize the next member of the aggregate of which the subaggregate
  54.   *>    is part.
  55.  
  56. The last part refers precisely to your construct. You did not begin the
  57. structure initializers with a left brace, hence the  members of the initializer
  58. list are simply handed to the next available fields in the next member of the
  59. outer aggregate (i.e. next structure in the array).
  60.  
  61. Of course, K&R2 is _not_ a subsititue for the ANSI/ISO standard, but it's the
  62. best I can do.  Dan Pop, the keeper of the standard, might have some additional
  63. pearls of wisdom to add.
  64.  
  65. [ code omitted ]
  66. -- 
  67.  
  68.